#pragma once
#include <iostream>
#include <string>
#include "InetAddr.hpp"
#include "Log.hpp"
#include "Socket.hpp"
#include "Protocol.hpp"
#include "NetCal.hpp"
#include "Connection.hpp"

using namespace log_ns;
using namespace socket_ns;
using namespace protocol_ns;

// 提供io服务，需要将对应的信息反序列化，然后执行，接着加上报头，然后继续序列化
// 然后将数据发送出去
class IOService {
public:
    IOService() {}

    void IOForword(calculate_t cal, Connection* conn) {
        // 使用循环读取，保证一次性读取完
        while (true) {
            std::string& packages_stream = conn->GetInbuff();

            // 在这里处理信息
            // 1. 先将数据解码
            std::string jsonstr = Decode(packages_stream);
            if (jsonstr.empty())
                return;

            std::cout << "----------------------------------" << std::endl;
            // 将解码的数据打印出来
            std::cout << "jsonstr\n" << jsonstr << std::endl;

            // 2. 然后将数据反序列化
            std::shared_ptr<Request> Req = Factory::BuildRequest();
            Req->Deserialize(jsonstr);

            // 3. 开始运行处理数据
            std::shared_ptr<Responce> Resp = cal(Req);

            // 4. 运行处理完数据之后将数据序列化
            std::string anti_jsonstr = Resp->Serialize();
            // 将序列化后的数据打印出来
            std::cout << "anti_json\n"
                    << anti_jsonstr << std::endl;

            // 5. 给序列化的数据加上报头
            std::string package = Encode(anti_jsonstr);

            // 将数据放到outbuff中
            conn->AppendOutbuff(package);
        }
    }

    ~IOService() {}
};